using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlotManager : MonoBehaviour
{
    public static PlotManager plotManager; // 静态实例，用于全局访问PlotManager
    private int childMaxCount = 0; // 最多可能有几个选项（原注释），表示每组对话最多可以有的选项数

    private void Awake() {
        // 在Awake阶段将静态实例设为当前对象，确保PlotManager可以被全局访问
        plotManager = this;
    }

    private void Start() {
        // 在启动时，初始化最大选项按钮数量为DialogUI中选项按钮的总数量
        childMaxCount = DialogUI.dialog.optsBut.Count;
    }

    private List<DialogGroup> plot; // 剧情（原注释），存储当前正在播放的剧情对话组列表
    private int count = 0; // 当前对话组中正在播放的对话索引（原注释）
    private int nowDialogGroup = 0; // 当前播放的对话组索引（原注释）
    private int choose = 0; // 按钮选择（原注释），记录玩家选择的选项

    // 开始剧情
    public void Play(List<DialogGroup> plot) {
        this.plot = plot; // 设置剧情为指定的对话组列表（原注释）
        DialogUI.dialog.show(); // 显示对话框（原注释）
        Continue(); // 播放第一句对话
    }

    // 结束剧情
    public void End() {
        count = 0; // 重置当前对话索引
        nowDialogGroup = 0; // 重置当前对话组索引
        DialogUI.dialog.hideNextBut(); // 隐藏“继续”按钮
        DialogUI.dialog.hideOptsBut(); // 隐藏选项按钮

        InputControl.LockMouse(); // 锁定鼠标
        CharacterParam.param.isPlot = false; // 标记剧情状态为结束
        DialogUI.dialog.hide(); // 隐藏对话UI
    }

    private int showOptsButs = 0; // 显示的选项按钮数量（原注释）

    public void Continue() {
        // 开始时隐藏“继续”按钮和选项按钮，等待对话更新
        // 开始默认隐藏，等待处理
        DialogUI.dialog.hideNextBut();
        DialogUI.dialog.hideOptsBut();

        // 如果当前对话组中的对话尚未播放完
        if (count < plot[nowDialogGroup].dialogs.Length) {
            // 开始默认隐藏，等待处理(原注释)
            // 显示“继续”按钮，并设置对话UI的名称和内容
            DialogUI.dialog.showNextBut();
            DialogUI.dialog.SetUIName(plot[nowDialogGroup].dialogs[count].name);
            DialogUI.dialog.SetUIContent(plot[nowDialogGroup].dialogs[count].content);
            count++; // 更新对话索引，指向下一个对话
        }
        else {// 当前对话组结束时，显示按钮，切换对话组(原注释)
            // 当前对话组已结束，计算显示的选项数量并显示对应按钮
            showOptsButs = CalShowOptBut();
            if (showOptsButs == 0) {
                // 如果没有选项可以显示，则结束剧情
                End();
                return;
            }
            // 计算显示的数量并设置按钮的文本(原注释) 显示计算出的选项按钮
            DialogUI.dialog.showOptsBut(showOptsButs);
            count = 0; // 重置当前对话索引
        }
    }

    // 计算要显示的按钮数量
    private int CalShowOptBut() {
        int showCount = 0; // 初始化显示的按钮数量

        // 设置选项按钮的文本内容
        for (int i = nowDialogGroup * childMaxCount + 1; i <= nowDialogGroup * childMaxCount + childMaxCount && i < plot.Count; i++) {
            if (plot[i] != null) {
                // 如果对话组存在，设置按钮文本为该对话组的第一句对话内容
                DialogUI.dialog.setOptsButText(i - nowDialogGroup * childMaxCount - 1, getFirstDialog(plot[i]));
            }
        }

        // 计算可以显示的按钮数量
        for (int i = nowDialogGroup * childMaxCount + 1; i <= nowDialogGroup * childMaxCount + childMaxCount && i < plot.Count; i++) {
            if (plot[i] != null) {
                showCount++; // 如果对话组存在，增加显示数量
            }
        }
        return showCount; // 返回可以显示的按钮数量
    }

    // 计算要切换对话组的下标(原注释) // 更新当前对话组索引，根据玩家的选择切换到新的对话组
    private void updataDialogGroup() {
        nowDialogGroup = nowDialogGroup * childMaxCount + choose; // 根据选择更新当前对话组
    }

    // 获取对话组的第一句对话内容
    private string getFirstDialog(DialogGroup item) {
        return item.dialogs[0].content; // 返回该对话组的第一句对话内容
    }

    // 选项1的按钮事件
    public void Opt1() {
        choose = 1; // 选择第一个选项
        updataDialogGroup(); // 更新当前对话组
        Continue(); // 继续播放下一段对话
    }

    // 选项2的按钮事件
    public void Opt2() {
        choose = 2; // 选择第二个选项
        updataDialogGroup(); // 更新当前对话组
        Continue(); // 继续播放下一段对话
    }

    // 选项3的按钮事件
    public void Opt3() {
        choose = 3; // 选择第三个选项
        updataDialogGroup(); // 更新当前对话组
        Continue(); // 继续播放下一段对话
    }
}
